//package cn.itsource.hrm.service.impl;
//
//import cn.itsource.hrm.constants.CourseConstants;
//import cn.itsource.hrm.domain.CourseType;
//import cn.itsource.hrm.mapper.CourseTypeMapper;
//import cn.itsource.hrm.service.ICourseTypeService;
//import com.baomidou.mybatisplus.mapper.EntityWrapper;
//import com.baomidou.mybatisplus.service.impl.ServiceImpl;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.cache.annotation.CacheEvict;
//import org.springframework.cache.annotation.Cacheable;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Service;
//
//import java.io.Serializable;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * <p>
// * 课程目录 服务实现类
// * </p>
// *
// * @author yaosang
// * @since 2022-04-08
// */
////@Service
//public class CourseTypeServiceImpl_02_springcache extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
//
//    @Autowired
//    private CourseTypeMapper mapper;
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    //1 递归
//    //1.1 代码递归 getTreeDataOfrecursion
//    //1.2 sql递归
//    //2 循环
//    @Override
//    @Cacheable(cacheNames = CourseConstants.KEY_COURSE_TYPE_TRE,key = "'ALL'")  //给一个key才能存放redis
//    public List<CourseType> treeData(Long pid) {
//        //代码递归：查询N+1次sql
//        //return getTreeDataOfRecursion(pid);
//        //sql递归：查询N+1次sql
//        //return mapper.loadTreeData(pid);
//        //循环方案： 只查询一次sql
//        return getTreeDataOfLoop();
//    }
//
//    private List<CourseType> getTreeDataOfLoop() {
//        //1 查询出所有的节点
//        List<CourseType> courseTypes = mapper.selectList(null);
//        Map<Long,CourseType> courseTypesMap = new HashMap<>();
//        courseTypes.forEach(courseType -> { //n+n=2n  n>2
//            courseTypesMap.put(courseType.getId(),courseType);
//        });
//        //2 申明返回顶级节点的List(其实就是无限极)
//        List<CourseType> result = new ArrayList<>();
//        //3 遍历所有的节点
//        courseTypes.forEach(courseType -> {  //n*n
//            Long pidTmp = courseType.getPid();
//            if (pidTmp.longValue()==0){//父id是我们传入pid，就是顶级节点
//                //3.1 判断是否是顶级节点，如果是直接放入List
//                result.add(courseType);
//            }else{
//                //3.2 如果不是，通过pid获取父亲，进而得到父亲儿子，把自己作为一个儿子放进去
//                CourseType parent = courseTypesMap.get(pidTmp);
//                //CourseType parent =null;
//                //for (CourseType type : courseTypes) {
//                //    if (type.getId().longValue()==pidTmp.longValue()){
//                //        parent = type;
//                //        break;
//                //    }
//                //
//                //}
//                parent.getChildren().add(courseType); //把自己作为一个儿子放进去
//            }
//
//        });
//        //4 返回顶级节点的List
//        return result;
//    }
//
//    //递归方案
//    //1 自己调用自己
//    //2 出口
//    private List<CourseType> getTreeDataOfRecursion(Long pid) {
//
//        //1 通过pid查询儿子
//        List<CourseType> courseTypes = mapper
//                .selectList(new EntityWrapper<CourseType>().eq("pid", pid));
//        //2 如果没有儿子就是出口
//        if (courseTypes==null || courseTypes.size()<1)
//            return null;
//        //3 自己调用自己
//        for (CourseType type : courseTypes) {
//            Long pidTmp = type.getId(); //通过自己的id查询儿子
//            List<CourseType> children = getTreeDataOfRecursion(pidTmp);
//            type.setChildren(children);
//        }
//        return courseTypes;
//    }
//
//
//    /**
//     * 做完了缓存后，数据库数据发生改变的操作，都要同步数据到redis缓存。
//     * 方案1：立即设置，  redisTemplate.opsForValue().set(COURSE_TYPE_CACHE_KEY_IN_REDIS,courseTypesInDb);
//     * 方案2：先删除缓存，下次查询时如果没有再查询数据库并设置缓存（采纳）
//     */
//    @Override
//    @CacheEvict(cacheNames = CourseConstants.KEY_COURSE_TYPE_TRE,key = "'ALL'")


//    public boolean insert(CourseType entity) {
//        super.insert(entity);
//        return true;
//    }
//
//    @Override
//    @CacheEvict(cacheNames = CourseConstants.KEY_COURSE_TYPE_TRE,key = "'ALL'")
//    public boolean deleteById(Serializable id) {
//         super.deleteById(id);
//        return true;
//    }
//
//    @Override
//    @CacheEvict(cacheNames = CourseConstants.KEY_COURSE_TYPE_TRE,key = "'ALL'")
//    public boolean updateById(CourseType entity) {
//        super.updateById(entity);
//        return true;
//    }
//}
